'''
Created on 15 mars 2011

@author: paraita
    
    Filtrage: questions 3.2 et 3.3
    
    Dans un premier temps on fait le signal somme,
    on le filtre, enfin on l'affiche

'''

import numpy
import matplotlib.pylab as pylab
import Signaux.Signal as Signal


def dessinPourQuestion32(tt, s):
    '''
    representation du signal somme en temporel et frequentiel
    @param tt coordonnees abscisses
    @param s coordonnees ordonnees
    '''
    pylab.subplot(1,3,1)
    pylab.plot(tt,s,'-b')
    pylab.title("signal s(t)")
    
    sp = numpy.fft.fft(s)
    sp = numpy.fft.fftshift(sp)
    
    pylab.subplot(1,3,2)
    pylab.plot(s,abs(sp), '.-r')
    pylab.title("spectre (mag)")
    
    pylab.subplot(1,3,3)
    pylab.plot(s, numpy.angle(sp), '.-r')
    pylab.title("spectre (ph)")

def dessinPourQuestion33(tt, s, filtred, freqStep, N, nbSamples):
    '''
    representation du signal somme filtred et original
    @param tt abscisses
    @param s ordonnees du signal
    @param filtred ordonnees du signal filtre
    @param freqStep frequence
    @param N echantillonnage
    @param nbSamples nombre de samples
    '''
    pylab.subplot(2,3,1)
    pylab.plot(tt,s,'b')
    pylab.title("signal s(t) original")
    
    sp = numpy.fft.fft(s)
    sp = numpy.fft.fftshift(sp)
    
    tableFreq = freqStep * numpy.arange(-nbSamples / 2, nbSamples / 2)
    
    pylab.subplot(2,3,2)
    pylab.plot(tableFreq,abs(sp), 'r')
    pylab.title("spectre (mag)")
    
    pylab.subplot(2,3,3)
    pylab.plot(tableFreq, numpy.angle(sp), 'r')
    pylab.title("spectre (ph)")
    
    
    pylab.subplot(2,3,4)
    pylab.plot(tt,filtred,'.-b')
    pylab.title("signal s(t) filtred")
    
    sp1 = numpy.fft.fft(filtred)
    sp1 = numpy.fft.fftshift(sp1)
    
    pylab.subplot(2,3,5)
    pylab.plot(tableFreq,abs(sp1), 'r')
    pylab.title("spectre (mag)")
    
    pylab.subplot(2,3,6)
    pylab.plot(tableFreq, numpy.angle(sp1), 'r')
    pylab.title("spectre (ph)")

def filtrage(tt, s):
    '''
    retourne le signal filtred
    @param tt abscisse du signal
    @param s ordonnees du signal
    ''' 
    b = [ -6.849167e-003, 1.949014e-003, 1.309874e-002, 1.100677e-002, -6.661435e-003,-1.321869e-002, 6.819504e-003, 2.292400e-002, 7.732160e-004,-3.153488e-002,-1.384843e-002, 4.054618e-002, 3.841148e-002,-4.790497e-002,-8.973017e-002, 5.285565e-002, 3.126515e-001, 4.454146e-001, 3.126515e-001, 5.285565e-002, -8.973017e-002,-4.790497e-002, 3.841148e-002, 4.054618e-002, -1.384843e-002,-3.153488e-002, 7.732160e-004, 2.292400e-002, 6.819504e-003,-1.321869e-002,-6.661435e-003, 1.100677e-002, 1.309874e-002, 1.949014e-003,-6.849167e-003]
    
    filtred = []
    
    for i in range(tt.size):
        temp = 0
        for n in range(35):
            print "i=",i," n=",n
            temp += b[n] * s[i-n]
        filtred.append(temp)
    
    return tt, filtred


def main():
    # N est l'echantillonnage
    N = 300
    nbSamples = N
    freqStep = nbSamples / N
    
    #generation des signaux
    s1 = Signal.Sinusoide(amplitude=1, phase=0, frequence=0.01, samples=nbSamples, n=N).calculateCourbe().getValues()
    s2 = Signal.Sinusoide(amplitude=1, phase=0, frequence=0.02, samples=nbSamples, n=N).calculateCourbe().getValues()
    s3 = Signal.Sinusoide(amplitude=1, phase=0, frequence=0.4, samples=nbSamples, n=N).calculateCourbe().getValues()
    
    # creation du signal somme
    s4 = []
    for i in range(len(s1[0])):
        s4.append(s1[1][i] + s2[1][i] + s3[1][i])
        
    # affichage temporel et frequentiel du signal somme
    # a decommenter si on veut juste voir le signal
    #dessinPourQuestion32(s1[0], s4)
    
        
    # je filtre le signal somme
    filtred = filtrage(s1[0], s4)

    # et j'affiche tout
    # est ce qu'il est normal le petit decalage quand c'est filtred ?!
    dessinPourQuestion33(filtred[0], s4, filtred[1], freqStep, N, nbSamples)
    
    pylab.show()
    pass

if __name__ == '__main__':
    main()